package niveles;

import java.util.Iterator;
import java.util.LinkedList;

import juego.ContadorDePuntos;
import juego.PuntajeMaximo;

import VistasTexto.VistaTextoPuntaje;
import pistas.*;
import recursos.*;
import vistas.*;
import espacio.Aeropuerto;
import titiritero.Gameloop;
import titiritero.ObservadorDeGameLoop;

public abstract class Nivel {
	
	protected LinkedList<Pista> pistas = new LinkedList<Pista>();
	
	//Carga los niveles en el aeropuerto para ser Utilizado
	public Aeropuerto cargarNivel(Gameloop unControlador, Aeropuerto aeropuertoActual) {
		
		aeropuertoActual = new Aeropuerto();

		
		VistaAeropuerto vistaAeropuerto = new VistaAeropuerto(aeropuertoActual);
		vistaAeropuerto.setPosicionable(aeropuertoActual);
		
		unControlador.agregarDibujable(vistaAeropuerto);
		
		VistaTextoPuntaje texto = new VistaTextoPuntaje(aeropuertoActual.getContador());
		unControlador.agregarDibujable(texto);
		
		try {
			PuntajeMaximo puntajeMaximo = 
					new PuntajeMaximo(ContadorDePuntos.cargar().getPuntaje());
			VistaTextoPuntaje vista = new VistaTextoPuntaje(puntajeMaximo);
			unControlador.agregarDibujable(vista);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		
		Iterator<Pista> iterador = pistas.iterator();
		while (iterador.hasNext()){
			
			
			Pista pistaActual = iterador.next();
			
			agregarPistaAlAeropuerto(aeropuertoActual, pistaActual);
			
			cargarVista(unControlador, pistaActual);
		}
		
		unControlador.setObservadorDeGameLoop((ObservadorDeGameLoop)aeropuertoActual);
		
		return aeropuertoActual;
		
	}

	private void agregarPistaAlAeropuerto(Aeropuerto aeropuertoActual, Pista unaPista){
		
		aeropuertoActual.agregarPista(unaPista);
	}
	
	private void cargarVista(Gameloop unControlador, Pista unaPista){
		
		AsociadorDeVistasDePista asociadorDeVistasDePista = new AsociadorDeVistasDePista();
		
		VistaPista vistaPista = (VistaPista)asociadorDeVistasDePista.devolverVista(unaPista);
		
		vistaPista.setPosicionable(unaPista);
		
		unControlador.agregarDibujable(vistaPista);
		
	}
}
